package com.time.admin.application.controller;

import com.google.common.base.Preconditions;
import com.time.admin.application.converter.FriendLinkDTOConverter;
import com.time.admin.application.dto.FriendLinkDTO;
import com.time.admin.common.entity.PageResult;
import com.time.admin.domain.entity.FriendLinkBO;
import com.time.admin.domain.service.AdminFriendLinkDomainService;
import com.time.auth.entity.Result;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

/**
 * 友链管理控制层类
 *
 * @author: HuangQi
 * @date: Created in 16:13 2025/10/31
 * @description: 友链管理控制层
 */
@Slf4j
@RestController
@RequestMapping("/admin/friendLink/")
public class FriendLinkController {

    @Autowired
    private AdminFriendLinkDomainService adminFriendLinkDomainService;

    /**
     * 新增友链
     *
     * @param friendLinkDTO 新增友链信息
     * @return 新增结果
     */
    @PostMapping("add")
    public Result<Boolean> add(@RequestBody FriendLinkDTO friendLinkDTO) {
        try {
            if (log.isInfoEnabled()) {
                log.info("Admin.FriendLinkController.add.dto:{}", friendLinkDTO);
            }
            // 参数校验
            Preconditions.checkNotNull(friendLinkDTO.getLinkName(), "友链的名称不能为空");
            Preconditions.checkNotNull(friendLinkDTO.getLinkUrl(), "友链的链接不能为空");
            Preconditions.checkNotNull(friendLinkDTO.getDescription(), "友链的描述不能为空");
            Preconditions.checkNotNull(friendLinkDTO.getCategory(), "友链的分类不能为空");

            // 调用领域层
            FriendLinkBO friendLinkBO = FriendLinkDTOConverter.INSTANCE.convertDTOToBO(friendLinkDTO);
            Boolean addResult = adminFriendLinkDomainService.add(friendLinkBO);

            // 返回结果
            return Result.ok(addResult);
        } catch (Exception e) {
            // 异常处理
            log.error("Admin.FriendLinkController.add.error:{}", e.getMessage(), e);
            return Result.fail("管理模块新增友链失败");
        }
    }

    /**
     * 更新友链
     *
     * @param friendLinkDTO 更新友链的信息
     * @return 更新结果
     */
    @PostMapping("update")
    public Result<Boolean> update(@RequestBody FriendLinkDTO friendLinkDTO) {
        try {
            if (log.isInfoEnabled()) {
                log.info("Admin.FriendLinkController.update.dto:{}", friendLinkDTO);
            }
            // 参数校验
            Preconditions.checkNotNull(friendLinkDTO.getLinkId(), "友链的id不能为空");
            Preconditions.checkNotNull(friendLinkDTO.getLinkName(), "友链的名称不能为空");
            Preconditions.checkNotNull(friendLinkDTO.getLinkUrl(), "友链的链接不能为空");
            Preconditions.checkNotNull(friendLinkDTO.getDescription(), "友链的描述不能为空");
            Preconditions.checkNotNull(friendLinkDTO.getCategory(), "友链的分类不能为空");

            // 调用领域层
            FriendLinkBO friendLinkBO = FriendLinkDTOConverter.INSTANCE.convertDTOToBO(friendLinkDTO);
            Boolean updateResult = adminFriendLinkDomainService.update(friendLinkBO);

            // 返回结果
            return Result.ok(updateResult);
        } catch (Exception e) {
            // 异常处理
            log.error("Admin.FriendLinkController.update.error:{}", e.getMessage(), e);
            return Result.fail("管理模块更新友链失败");
        }
    }

    /**
     * 删除友链
     *
     * @param id 删除友链的id
     * @return 删除结果
     */
    @PostMapping("delete/{id}")
    public Result<Boolean> delete(@PathVariable("id") Long id) {
        try {
            if (log.isInfoEnabled()) {
                log.info("Admin.FriendLinkController.delete.id:{}", id);
            }
            // 参数校验
            Preconditions.checkNotNull(id, "友链的id不能为空");

            // 调用领域层
            Boolean deleteResult = adminFriendLinkDomainService.delete(id);

            // 返回结果
            return Result.ok(deleteResult);
        } catch (Exception e) {
            // 异常处理
            log.error("Admin.FriendLinkController.delete.error:{}", e.getMessage(), e);
            return Result.fail("管理模块删除友链失败");
        }
    }

    /**
     * 分页查询所有友链
     *
     * @param friendLinkDTO 分页查询所有友链信息
     * @return 分页友链信息结果
     */
    @PostMapping("queryAll")
    public Result<PageResult<FriendLinkDTO>> queryAllFriendLink(@RequestBody FriendLinkDTO friendLinkDTO) {
        try {
            if (log.isInfoEnabled()) {
                log.info("Admin.FriendLinkController.queryAllTag.dto: {}", friendLinkDTO);
            }

            // 调用领域层
            FriendLinkBO friendLinkBO = FriendLinkDTOConverter.INSTANCE.convertDTOToBO(friendLinkDTO);
            PageResult<FriendLinkBO> infoBOPageResult = adminFriendLinkDomainService.queryAllFriendLink(friendLinkBO);

            // 返回结果
            PageResult<FriendLinkDTO> infoDTOPageResult = FriendLinkDTOConverter.INSTANCE.convertBOPageToDTOPage(infoBOPageResult);
            return Result.ok(infoDTOPageResult);
        } catch (Exception e) {
            // 异常处理
            log.error("Admin.FriendLinkController.queryAllTag.error:{}", e.getMessage(), e);
            return Result.fail("管理模块分页获取所有友链失败");
        }
    }

    /**
     * 获取友链管理面板数据
     *
     * @return 友链管理面板信息
     */
    @PostMapping("queryLinkDashboard")
    public Result<FriendLinkDTO> queryLinkDashboard() {
        try {
            if (log.isInfoEnabled()) {
                log.info("Admin.FriendLinkController.queryLinkDashboard");
            }

            // 调用领域层
            FriendLinkBO friendLinkBO = adminFriendLinkDomainService.queryLinkDashboard();

            // 返回结果
            FriendLinkDTO friendLinkDTO = FriendLinkDTOConverter.INSTANCE.convertBOToDTO(friendLinkBO);
            return Result.ok(friendLinkDTO);
        } catch (Exception e) {
            // 异常处理
            log.error("Admin.FriendLinkController.queryLinkDashboard.error:{}", e.getMessage(), e);
            return Result.fail("管理模块分页获取友链管理面板数据失败");
        }
    }

}
